package main

import (
	"bufio"
	"fmt"
	"golang-learning/src/yayako.cn/day14/tcp/sticky-bag/protocol"
	"io"
	"net"
)

// tcp粘包
/*
	出现原因：
		主要原因：tcp数据传递模式是流模式，在保持长连接的时候可以进行多次的收发
		粘包可发生在发送端也可以发生在接受端：
			1. 由Nagle算法造成的发送端的粘包：Nagle算法是一种改善网络传输效率的算法，简单来说就是不会立刻发送我们提交的数据，而是等待一小段时间看看是都还有要发送的数据，若有，则一起发送。
			2. 接收端接收不及时造成的接收端粘包：tcp会把接收到的数据存在自己的缓冲区中，然后通知应用层取数据。当应用层无法及时取出数据时，就会造成缓冲区中存放多段数据。
*/
/*
	func process(conn net.Conn) {
		defer conn.Close()
		reader := bufio.NewReader(conn)
		var buf [1024]byte
		for {
			n, err := reader.Read(buf[:])
			if err == io.EOF {	// 读取完毕
				break
			}
			if err != nil {
				fmt.Println("read from client err:", err)
				break
			}
			fmt.Println(string(buf[:n]))
		}
	}
*/

func process(conn net.Conn) {
	defer conn.Close()
	reader := bufio.NewReader(conn)
	for {
		msg, err := protocol.Decode(reader)
		if err == io.EOF {
			return
		}
		if err != nil {
			fmt.Println("decode failed, err:", err)
			return
		}
		fmt.Println("收到消息：", msg)
	}
}

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:1818")
	if err != nil {
		fmt.Println("listen failed, err:", err)
		return
	}
	defer listener.Close()
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("accept failed, err:", err)
			continue
		}
		go process(conn)
	}
}
